import json

# merge dictionary
def merge_json(json1, json2):
    if len(json1) == 0:
        return json2
    if len(json2) == 0:
        return json1
    for key in json1[0].keys():
        if key in json2[0]:
            return 'ERROR: 全局变量中有重复的参数名 {}'.format(key)
    json1[0].update(json2[0])
    json1[1].update(json2[1])
    for key in json1[2].keys():
        if key in json2[2]:
            return 'ERROR: 常量中有重复的参数名 {}'.format(key)
    json1[2].update(json2[2])
    for key in json1[3].keys():
        if key in json2[3]:
            return 'ERROR: 局部变量中有重复的参数名 {}'.format(key)
    json1[3].update(json2[3])
    return json1


def str_to_json_502(text):
    rows = text.split("\r\n")[1:]  # 去表头
    json_list = []
    json_tmp = {}
    # traverse the table
    for i in range(len(rows)):
        if (rows[i].startswith("\t")):
            rows[i] = rows[i][1:]
        cells = rows[i].split("\t")
        length = len(cells)
        if length == 5:
            # 这是一个新对象
            json_list.append(json_tmp)
            json_tmp = {}
            if (len(cells[1].strip()) == 0):
                continue
            param = cells[1].strip()
            name = cells[4].strip()
            json_tmp[param] = {
                "name": name,
                "type": cells[3].strip(),
                "dim": cells[2].strip(),
            }
        else:
            # 这是一个已经存在的对象
            param = cells[0].strip()
            if (len(param) == 0):
                continue
            name = cells[3].strip()
            json_tmp[param] = {
                "name": name,
                "type": cells[2].strip(),
                "dim": cells[1].strip(),
            }
    json_list.append(json_tmp)
    json_result = []
    json_list[1].update(json_list[2])
    json_result.append(json_list[1])  # 输入量和输出量合并
    json_result.append(json_list[5])  # 底层库函数
    json_result.append(json_list[4])  # 常量
    json_result.append(json_list[3])  # 局部变量
    json_result.append("功能描述")  # 描述
    # 修改底层库函数属性
    json_tmp = json_result[1]
    for key in json_tmp.keys():
        json_tmp[key]["declaration"] = json_tmp[key]["name"].replace("\n", "")
        del json_tmp[key]["name"]  # 底层库函数不需要name
        json_tmp[key]["output_type"] = json_tmp[key]["type"] if json_tmp[key]["type"] != "" else ""
        del json_tmp[key]["type"]
        json_tmp[key]["output_dim"] = json_tmp[key]["dim"] if json_tmp[key]["dim"] != "" else ""
        del json_tmp[key]["dim"]
        json_tmp[key]["output_value"] = ""
    # 输出JSON结果
    print(json.dumps(json_result, ensure_ascii=False))
    return json_result


def str_to_json_502_new(text):
    rows = text.split("\r\n")[1:]  # 去表头
    json_list = []
    json_tmp = {}
    # traverse the table
    for i in range(len(rows)):
        if (rows[i].startswith("\t")):
            rows[i] = rows[i][1:]
        cells = rows[i].split("\t")
        if len(cells) == 5:
            # 这是一个新对象
            json_list.append(json_tmp)
            json_tmp = {}
            if (len(cells[1].strip()) == 0):
                continue
            param = cells[1].strip()
            name = cells[4].strip()
            json_tmp[param] = {
                "name": name,
                "type": cells[3].strip(),
                "dim": cells[2].strip(),
            }
        else:
            # 这是一个已经存在的对象
            param = cells[0].strip()
            if (len(param) == 0):
                continue
            name = cells[3].strip()
            json_tmp[param] = {
                "name": name,
                "type": cells[2].strip(),
                "dim": cells[1].strip(),
            }
    json_list.append(json_tmp)
    json_result = []
    json_result.append(json_list[1])  # 全局变量
    json_result.append({})  # 底层库函数
    json_result.append(json_list[3])  # 常量
    json_result.append(json_list[2])  # 局部变量
    json_result.append("功能描述")  # 描述
    # 输出JSON结果
    print(json.dumps(json_result, ensure_ascii=False))
    return json_result


def domain_to_json_502(text: str):
    if "底层库函数" not in text or "宏常量/宏函数" not in text or "关键字与运算符" not in text:
        return {}, {}, {}
    under_func_str = text[:text.index("宏常量/宏函数\t\t\t\t\r\n")]
    macro_str = text[text.index("宏常量/宏函数\t\t\t\t\r\n"):text.index("关键字与运算符\t\t\t\t\r\n")]
    key_word_str = text[text.index("关键字与运算符\t\t\t\t\r\n"):]
    under_func_res = {}
    macro_res = {}
    key_word_res = {}
    # 底层库函数
    under_funcs = under_func_str.split("\r\n")[2:-1]
    for i in range(len(under_funcs)):
        cells = under_funcs[i].split("\t")
        if cells[0].strip():
            under_func_res[cells[0].strip()] = {
                "output_value": cells[1].strip(),
                "output_dim": cells[2].strip(),
                "output_type": cells[3].strip(),
                "declaration": cells[4].strip()
            }
    # 宏常量/宏函数
    macros = macro_str.split("\r\n")[2:-1]
    for i in range(len(macros)):
        cells = macros[i].split("\t")
        if cells[0].strip():
            macro_res[cells[0].strip()] = {
                "name": cells[1].strip(),
                "type": "float64",
                "dim": "1*1",
            }
    # 关键字与运算符
    key_words = key_word_str.split("\r\n")[2:-1]
    for i in range(len(key_words)):
        cells = key_words[i].split("\t")
        name = cells[0].strip()
        if name == None or len(name) == 0:
            continue
        s = set([])
        if name not in key_word_res:
            s.add(cells[1].strip())
        else:
            s = set(key_word_res[name])
            s.add(cells[1].strip())
        key_word_res[name] = list(s)
    return under_func_res, macro_res, key_word_res


if __name__ == '__main__':
    text = '类型\t符号\t维度\t数据类型\t对应软件变量/值/宏\t\r\n全局变量\t\\hat{\\omega}\t3*1\tfloat64\tmGyroData_FY4.wd\r\n\t\\widehat{\\bar{q}}\t4*1\tfloat64\tmAttitude.q\r\n\t{\\hat{\\omega}}_z\t1\tfloat64\tmGyroData_FY4.wd[2]\r\n\t\t\t\t\r\n局部变量\tadg\t1\tfloat64\tdeltag\r\n\td\\hat{g}\t3*1\tfloat64\ttdg.d3\r\n\tMdg\t4*4\tfloat64\ttMg44.d44\r\n\ttmpMat44\t4*4\tfloat64\ttmpMat44\r\n\t\t\t\t\r\n常量/宏\tdT1\t1\tfloat64\tTS\r\n\t\t\t\t\r\n'
    print(str_to_json_502_new(text))